package org.hxzon.demo.jt.json;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.tapestry5.json.JSONArray;
import org.apache.tapestry5.json.JSONObject;

public class JsonObjectUtil {

    // 已知一个复合型数据对象o（每一个数据项都有可能是Map，List，Set，String等数据）
    // 1、查找统计指定字符串在该对象内字符串数据项中的出现次数
    // 2、将第一步查找出来的位置替换为指定的另一个字符串

    // 查找统计o内的所有字符串数据项中s的出现次数（hxzon:全等比較）
    public static int find(Object o, String s) {
        int result = 0;
        if (o instanceof String && ((String) o).contains(s)) {// string
            result++;
        } else if (o instanceof JSONObject) {// map
            JSONObject jsonO = (JSONObject) o;
            for (String key : jsonO.keys()) {
                Object mv = jsonO.get(key);
                result += find(mv, s);
            }
        } else if (o instanceof JSONArray) {// list,set
            for (Object av : ((JSONArray) o)) {
                result += find(av, s);
            }
        }
        return result;
    }

    // 将o内的所有字符串中的src替换为dst（hxzon：字符串包含）
    public static void replace(Object o, String src, String dst) {
        if (o instanceof JSONObject) {// map
            JSONObject jsonO = (JSONObject) o;
            for (String key : jsonO.keys()) {
                Object mv = jsonO.get(key);
                if (mv instanceof String) {
                    jsonO.put(key, ((String) mv).replaceAll(src, dst));
                } else {
                    replace(mv, src, dst);
                }
            }
        } else if (o instanceof JSONArray) {// list,set
            JSONArray jsonA = (JSONArray) o;
            for (int i = 0; i < jsonA.length(); i++) {
                Object av = jsonA.get(i);
                if (av instanceof String) {
                    jsonA.put(i, ((String) av).replaceAll(src, dst));
                } else {
                    replace(av, src, dst);
                }
            }
        }
    }

    public static void log(String msg) {
        System.out.println(msg);
    }

    public static void main(String[] args) {
        String file = "D:/work-juntai/训练题/复合型数据存取访问-测试数据/s18.o";
        String textBeFind = "r1";
        String textBeReplace = "r1";
        String textReplace = "R1";
        try {
            String jsonS = FileUtils.readFileToString(new File(file));
            JSONObject jsonO = new JSONObject(jsonS);
            log("find count:" + find(jsonO, textBeFind));
            JsonObjectUtil.replace(jsonO, textBeReplace, textReplace);
            log(jsonO.toString(false));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
